# ---------- 文件信息 ---------- #
# FlowClassifer.py
# 本文件实现的是一个数据包分类器,它的作用是将数据包按流进行分类,最后得到输入的数据包中
# 每个数据流的流标识符以及相应的计数值.
# 作者：赵宗义，xinshengzzy@foxmail.com, 2021.1.12
# ---------- #
from simulators.BaseSimulator import BaseSimulator
from network.RecordInfo import RecordInfo
import 文件工具


class FlowClassifier(BaseSimulator):
    def __init__(self):
        super(FlowClassifier, self).__init__()
        self.开始时间 = -1
        self.结束时间 = -1
        # ---------- 关于最大时间间隔 ---------- #
        self.剔除单质流 = True
        # -------------------- #

    def 处理事件(self, 临量):
        数据包 = 临量.提取数据包()
        标识符 = 数据包.提取流标识符()
        if 标识符 in self.流记录集:
            self.流记录集[标识符].更新(数据包)
        else:
            self.流记录集[标识符] = RecordInfo(数据包)

    def 获取并发流数(self):
        print("持续时间:%f" % (self.结束时间 - self.开始时间))
        时间点 = (self.开始时间 + self.结束时间)/2.0
        并发流数 = 0
        for 流信息 in self.流记录集.values():
            if 流信息.活跃(时间点):
                并发流数 += 1
        return 并发流数

    def 在线流长查询(self, 标识符):
        if 标识符 in self.流记录集:
            return self.流记录集[标识符].获取流长()
        else:
            return 0

    def 获取流记录集(self):
        流集 = dict()
        for 标识符, 信息 in self.流记录集.items():
            if self.统计模式 == self.包模式:
                流集[标识符] = 信息.包数
            elif self.统计模式 == self.字节模式:
                流集[标识符] = 信息.字节数
        return 流集

    def 获取流寿命集(self):
        流集 = dict()
        for 标识符, 信息 in self.流记录集.items():
            流集[标识符] = 信息.获取持续时间()
        return 流集

    def 获取最大间隔(self):
        流集 = dict()
        for 标识符, 信息 in self.流记录集.items():
            if (not self.剔除单质流) or (信息.包数 > 1):
                流集[标识符] = 信息.获取最大间隔()
        return 流集

    def 备份(self, 文件名):
        备份 = dict()
        备份["流记录集"] = self.获取流记录集()
        备份["数据包数"] = self.数据包数
        文件工具.备份数据(备份, 文件名)
